#include "imagesmodel.h"
#include <QProcess>
#include <QDir>
//#include <QDebug>

ImagesModel::ImagesModel(QObject *parent) :
    QAbstractItemModel(parent){
}

/** Используется другими компонентами для получения информации о каждом элементе, предоставляемом моделью.*/
Qt::ItemFlags ImagesModel::flags( const QModelIndex & i ) const{
	return QAbstractItemModel::flags(i);
}

/** Снабжает представления и делегаты данными элементов.*/
QVariant ImagesModel::data( const QModelIndex & i, int role) const{
	if(i.isValid() && i.row() < pathList.size()){
		switch(role){
		case Qt::DisplayRole:
			return pathList.at(i.row());
		default:
			NULL;
		}
	}else{
		return NULL;
	}
}

/** Предоставляется представлениям с информацией для показа в их заголовках..*/
QVariant ImagesModel::headerData( int, Qt::Orientation, int) const{
	return trUtf8("Колекция");
}

/** Количество строк данных, доступных в модели.*/
int ImagesModel::rowCount( const QModelIndex & parent) const{
	if(parent == QModelIndex())
		return pathList.size();
	else
		return 0;
}

/** Количество столбцов данных, доступных в модели.*/
int ImagesModel::columnCount( const QModelIndex & parent) const{
	if(parent == QModelIndex())
		return 1;
	else
		return 0;
}

/** Добавляет новую строку.*/
bool ImagesModel::insertRow(int row, const QString &fileName){
	if(row < pathList.size()){
		pathList.insert(row, fileName);
		emit dataChanged(index(row, row), index(pathList.size(), 0));
		return true;
	}else
		return false;
}

/** Удаляет строки.*/
bool ImagesModel::removeRows( int row, int count){
	if(row < pathList.size()){
		int n1 = row + count;
		int n2 = pathList.size();
		for(int i = row; i < n1 && i < n2; ++i)
			pathList.removeAt(row);
		emit dataChanged(index(row, n1), index(pathList.size(), 0));
		return true;
	}else
		return false;
}

/** Удаляет строку.*/
bool ImagesModel::removeRow( int r){
	if(r < pathList.size()){
		pathList.removeAt(r);		
		emit dataChanged(index(r, r), index(pathList.size(), 0));
		return true;
	}else
		return false;
}

/** Получая модельный индекс родительского элемента, эта функция позволяет представлениям и делегатам обращаться к дочерним элементам этого элемента.*/
QModelIndex ImagesModel::index( int row, int column, const QModelIndex & parent) const{
	if(parent == QModelIndex() && row < pathList.size(), column < 1)
		return createIndex( row, column, row);
	else
		return QModelIndex();
}

/** Возвращает модельный индекс, соответствующий родителю какого-либо дочернего элемента..*/
QModelIndex ImagesModel::parent( const QModelIndex &) const{
	return QModelIndex();
}

void ImagesModel::save(const QString &fileName){
	QString command = "7z a " + '"' + fileName + '"';
	for(int i = 0; i < pathList.size(); ++i)
		command += ' ' + '"' + pathList.at(i) + '"';
	QProcess::execute(command);
}

/** Открыть галерею.
 *
 * @param fileName имя файла галереи.
 */
void ImagesModel::open(const QString & fileName){
	close();
//	qDebug()<<"ImagesModel::open()";
	QDir::setCurrent(QDir::homePath() + "/.lab6");
//	qDebug()<<QDir::currentPath();
	QString command = "7z x \"" + fileName + "\" -otmp";
//	qDebug()<<command;
	QProcess::execute(command);
	QString path = QDir::homePath() + "/.lab6/tmp/";
	pathList = QDir(path).entryList(QStringList("*.jpg"));
	for(int i = 0; i < pathList.size(); ++i)
		pathList[i].prepend(path);
	emit dataChanged(index(0, 0), index(pathList.size(), 0));
//	qDebug()<<pathList;
}

/** Удалить временную папку.*/
void ImagesModel::close(){
//	QDir dir(QDir::homePath() + "/.lab6/");
//	dir.rmdir("tmp");
	QProcess::execute("rm -r " + QDir::homePath() + "/.lab6/tmp");
}
